#include "ChoisirListe.h"

#include "Qlib.h"

#include <QtGui/QGroupBox>
#include <QtGui/QButtonGroup>
#include <QtGui/QRadioButton>
#include <QtGui/QVBoxLayout>
#include <QtGui/QPushButton>

#include <QtGui/QApplication>

using namespace std;

/** Constructeur standard, sert à réaliser un choix "normal".
 * Ici on construit l'objet dans le but de choisir la Race ou la
 * Classe. On a vraiment affaire à un objet de type ChoisirListe.
 *
 * Les éléments graphiques sont initialisés ici.
 *
 * @param nomGrp nom à afficher pour le groupe.
 * @param noms pointeur sur le conteneur des textes à afficher de
 * chaque radiobutton.
 * @param aide pointeur sur le conteneur des textes d'aide (ToolTips)
 * de chaque radiobutton.
 * @param parent pointeur sur le parent (orphelin par défaut).
 */
ChoisirListe::ChoisirListe(const string& nomGrp, const vector<string> *noms,
			  const vector<string> *aide, QWidget* parent)
  : BaseUI( "ChoisirListe", parent ), selection( 0 )
{
  /*Debug::*/empileNiveau( &interne );
  func() << "ChoisirListe::ChoisirListe -> début" << endmsg;

  boite = new QGroupBox( trUtf8( nomGrp.c_str() ), this );
  boiteLayout = new QVBoxLayout( boite );

  groupe = new QButtonGroup( this );

  unsigned i, nbr( noms -> size() );

  for ( i = 0; i < nbr; i++)
    {
      groupe -> addButton( new QRadioButton( trUtf8( noms -> at(i).c_str() ),
					     boite ), i );
      if ( aide != 0 )
	groupe -> button( i ) -> setToolTip( trUtf8( aide -> at(i).c_str() ) );
      boiteLayout -> addWidget( groupe -> button( i ) );
    }

  connect( groupe, SIGNAL( buttonClicked(int) ), this, SLOT( estChoisi(int) ) );

  boite -> setLayout( boiteLayout );

  groupe -> button( 0 ) -> setChecked( true );
  
  boiteLayout -> addStretch(1);
  boite -> setLayout(boiteLayout);

  boutons.push_back( new QPushButton( trUtf8("&Quitter"), this ) );
  boutons.back() -> setToolTip( trUtf8("Quitter le programme") );
  connect( boutons.back()  , SIGNAL( clicked() ), this, SLOT( annuler() ) );
  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Accepter et continuer") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( fermer() ) );

  fenetreLayout -> addWidget(boite);

  setFenetreLayout();

  func() << "ChoisirListe::ChoisirListe -> fin" << endmsg;
  /*Debug::*/depileNiveau();
}

/** Constructeur prévu pour les types dérivés.
 * Ici le nom du widget est également paramétrable.
 *
 * Les éléments graphiques sont initialisés ici.
 *
 * @param nomFen nom du widget.
 * @param nomGrp nom à afficher pour le groupe.
 * @param noms pointeur sur le conteneur des textes à afficher de
 * chaque radiobutton.
 * @param aide pointeur sur le conteneur des textes d'aide (ToolTips)
 * de chaque radiobutton.
 * @param parent pointeur sur le parent (orphelin par défaut).
 */
ChoisirListe::ChoisirListe(const string& nomFen,const string& nomGrp,
			   const vector<string> *noms,
			   const vector<string> *aide, QWidget* parent)
  : BaseUI( nomFen.c_str(), parent ), selection( 0 )
{
  /*Debug::*/empileNiveau( &interne );
  func() << "ChoisirListe::ChoisirListe -> début" << endmsg;

  boite = new QGroupBox( trUtf8( nomGrp.c_str() ), this );
  boiteLayout = new QVBoxLayout( boite );

  groupe = new QButtonGroup( this );

  unsigned i, nbr( noms -> size() );

  for ( i = 0; i < nbr; i++)
    {
      groupe -> addButton( new QRadioButton( trUtf8( noms -> at(i).c_str() ), boite ), i );
      if ( aide != 0 )
      	groupe -> button( i ) -> setToolTip( trUtf8( aide -> at(i).c_str() ) );
      boiteLayout -> addWidget( groupe -> button( i ) );
      debug() << "Bouton " << i << " : "
	      << toUtf8StdString(groupe -> button( i ) -> text()) << endmsg;
    }

  connect( groupe, SIGNAL( buttonClicked( int ) ), this, SLOT( estChoisi( int ) ) );

  boite -> setLayout( boiteLayout );

  groupe -> button( 0 ) -> setChecked( true );
  
  boiteLayout -> addStretch(1);
  boite -> setLayout(boiteLayout);

  boutons.push_back( new QPushButton( trUtf8("&Quitter"), this ) );
  boutons.back() -> setToolTip( trUtf8("Quitter le programme") );
  connect( boutons.back()  , SIGNAL( clicked() ), this, SLOT( annuler() ) );
  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Accepter et continuer") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( fermer() ) );

  fenetreLayout -> addWidget(boite);

  setFenetreLayout();

  func() << "ChoisirListe::ChoisirListe -> fin" << endmsg;
  /*Debug::*/depileNiveau();
}

/** Constructeur de copie.
 * Permet de dupliquer une instance de ChoisirListe.
 *
 * @param choixListe instance à copier.
 */
ChoisirListe::ChoisirListe(const ChoisirListe& choixListe)
  : BaseUI( choixListe ), selection( choixListe.selection )
{
  /*Debug::*/empileNiveau( &interne );
  func() << "ChoisirListe::ChoisirListe -> début" << endmsg;

  boite = new QGroupBox( choixListe.boite -> title(), this );
  boiteLayout = new QVBoxLayout( boite );

  groupe = new QButtonGroup( this );

  unsigned i, nbr( groupe -> buttons() . size() );

  for ( i = 0; i < nbr; i++)
    {
      groupe -> addButton( new QRadioButton( choixListe.groupe -> button( i ) -> text(), boite ), i );
      groupe -> button( i ) -> setToolTip( choixListe.groupe -> button( i ) -> toolTip() );
      boiteLayout -> addWidget( groupe -> button( i ) );
      debug() << "Bouton " << i << " : "
	      << toUtf8StdString(groupe -> button( i ) -> text()) << endmsg;
    }

  connect( groupe, SIGNAL( buttonClicked( int ) ), this, SLOT( estChoisi( int ) ) );  

  groupe -> button( 0 ) -> setChecked( true );
  
  boiteLayout -> addStretch(1);
  boite -> setLayout(boiteLayout);

  boutons.push_back( new QPushButton( trUtf8("&Quitter"), this ) );
  boutons.back() -> setToolTip( trUtf8("Quitter le programme") );
  connect( boutons.back()  , SIGNAL( clicked() ), this, SLOT( annuler() ) );
  boutons.push_back( new QPushButton( trUtf8("&OK"), this ) );
  boutons.back() -> setToolTip( trUtf8("Accepter et continuer") );
  connect( boutons.back(), SIGNAL( clicked() ), this, SLOT( fermer() ) );

  fenetreLayout -> addWidget(boite);

  setFenetreLayout();

  func() << "ChoisirListe::ChoisirListe -> fin" << endmsg;
  /*Debug::*/depileNiveau();
}

/** Destructeur, ne fait rien de spécial.
 * Est déclaré virtual afin d'assurer une séquence d'appel correcte
 * lors de la destruction d'objets dérivés.
 */
ChoisirListe::~ChoisirListe()
{}

/** Permet de récupérer le choix effectué.
 * Réalise l'affichage de la fenêtre. Tout le mécanisme est caché dans
 * les composant et le connecteur estChoisi.
 *
 * @return StatusCode \e true si le choix est validé, \e false
 * sinon. Le choix est stocké dans valeur().
 */
StatusCode ChoisirListe::demanderChoix()
{
  this -> show();

  qApp -> exec();

  return StatusCode( OK, selection );
}

/**
 * Connecteur permettant de savoir en permanence quel est le
 * radiobutton sélectionné.
 */
void ChoisirListe::estChoisi(const int& i)
{
  selection = static_cast< unsigned >( i );
}
